#ifndef ARP_H_
	#define ARP_H_

	#include <alt_types.h>

	#define HTYPE_ETH		0x01		//!< Тип протокола канального уровня (Ethernet). Сетевой порядок байт.
	#define PTYPE_IPv4		0x0800		//!< Тип протокола сетевого уровня (Ethernet). Сетевой порядок байт.
	#define HLEN_MAC		6
	#define PLEN_IPv4		4
	#define OPCODE_REQ		1			//!< Код запроса. Сетевой порядок байт..
	#define OPCODE_ASK		2			//!< Код ответа. Сетевой порядок байт.

	#define ARP_SIZE		(8 + (HLEN_MAC + PLEN_IPv4) * 2)
	#define ARP_OFST		ETH_HEAD_SIZE


	//! Структура пакета ARP
	union	arp_frame_u
	{
		struct __attribute__((packed, aligned(1)))
		{
			alt_u16		htype;					//!< Тип канального протокола
			alt_u16		ptype;					//!< Тип сетевого протокола
			alt_u8		hlen;					//!< Длина физического адреса в байтах
			alt_u8		plen;					//!< Длина логического адреса в байтах
			alt_u16		opcode;					//!< Код операции отправителя
			alt_u64		sha			:48;		//!< Sender hardware address. Физический адрес отправит
			alt_u32		spa;					//!< Sender protocol address. Логический адрес отправителя
			alt_u64		tha			:48;		//!< Target hardware address. Физический адрес получателя
			alt_u32		tpa;					//!< Target protocol address. Логический адрес получателя.
		};
		alt_u8			data[ARP_SIZE];
	};




	//! Тип пакетов ARP
	typedef union arp_frame_u 	arp_frame_t;


	//!	@brief				Обработчик запросов ARP
	/*!	@param 	req_frame	Указатель на фрейм ARP зароса
	 *	@param 	ask_frame	Указатель на фрейм сформированного ARP ответа
	 *	@return	err			Если 0, ошибок нет. Если 1, неверные парпаметры запроса
	 */
	alt_u8 arp_create_ask(alt_u8* req_frame, alt_u8* ask_frame);


	//!	@brief				Установка MAC адреса
	/*!	@param 	data		Данные MAC
	  *	@return	err			0
	 */
	alt_u8 arp_set_mac(alt_u64 data);

	//!	@brief				Установка IP адреса
	/*!	@param 	data		Данные IP
	  *	@return	err			0
	 */
	alt_u8 arp_set_ip(alt_u32 data);


	//!	@brief				Получить MAC источника
	/*!	@param 				нет
	  *	@return	MAC			MAC источника
	 */
	alt_u64 arp_get_smac();

#endif /* ARP_H_ */
